package com.loeng.framework.common.validation;

import com.loeng.framework.common.core.ArrayValuable;
import com.loeng.framework.common.validation.validator.InEnumCollectionValidator;
import com.loeng.framework.common.validation.validator.InEnumValidator;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

/**
 * 判断某个值是 否在枚举类对应的值中
 *
 * @ Constraint 是 Java Bean Validation（JSR 380）规范中的一个核心注解，用于标记自定义的约束注解。
 * 它的主要作用是将自定义的注解（如 @InEnum）与对应的验证器关联起来。
 * 具体作用如下：
 * 标识约束注解：告诉框架这是一个自定义的约束注解，需要进行验证。
 * 指定验证器类：通常会配合 validatedBy 属性使用，用来指定具体的验证逻辑实现类。
 * @author loeng
 * @date 2025/5/18 17:15
 */
@Target({
        ElementType.METHOD,
        ElementType.FIELD,
        ElementType.ANNOTATION_TYPE,
        ElementType.CONSTRUCTOR,
        ElementType.PARAMETER,
        ElementType.TYPE_USE
})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(
        validatedBy = {InEnumValidator.class, InEnumCollectionValidator.class}
)
public @interface InEnum {

    /**
     * @return 实现 EnumValuable 接口的
     */
    Class<? extends ArrayValuable<?>> value();

    String message() default "必须在指定范围 {value}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

}
